package net.comfycastle.musicplayer;

import android.app.Activity;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ListView;

/**
 * 이 어플리케이션에서 쓰이는 모든 리스트 프래그먼트의 부모.
 * onAttach 시의 리스트 초기화,
 * onDestroy 시의 커서 해제 등의 기능을 갖고 있다.
 * @author ricale
 *
 */
abstract public class BaseListFragment extends ListFragment {
	///////////
	//////////
	/////////   lifecycle callback method	
	
	/**
	 * 프래그먼트 객체들의 아이디를 정의하는 enum 클래스
	 * @author ricale
	 *
	 */
	public enum OBJECTID {
		/** 모든 곡을 표시하는 리스트 프래그먼트 */
		ALLSONG,
		/** 모든 앨범을 표시하는 리스트 프래그먼트 */
		ALLALBUM,
		/** 모든 아티스트를 표시하는 리스트 프래그먼트 */
		ALLARTIST,
		/** 모든 장르를 표시하는 리스트 프래그먼트 */
		ALLGENRE,
		/** 모든 작곡가를 표시하는 리스트 프래그먼트*/
		ALLCOMPOSER,
		
		/** 앨범 내부 곡 목록을 표시하는 리스트 프래그먼트 */
		LIST_INALBUM,
		/** 특정 아티스트의 앨범을 표시하는 리스트 프래그먼트 */
		ALBUM_INARTIST,
		/** 특정 그룹의 곡 목록을 표시하는 리스트 프래그먼트 */
		LIST_INGROUP
	} // end FragmentId
	
	///////////
	//////////
	/////////   lifecycle callback method	
	
	/**
	 * 액티비티에 붙었을 때 호출되는 콜백 메서드
	 */
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		setList();
	}  // end onAttach
	
	/**
	 * 프래그먼트가 파괴될 때 호출되는 콜백 메서드
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		MusicCursorAdapter adapter = (MusicCursorAdapter)getListAdapter();
		adapter.getCursor().close();
	} // end onDestroy
	
	///////////
	//////////
	/////////   abstract method	
	
	/**
	 * 생성 당시 입력 받은 분류 기준으로 앨범 목록을 만든다.
	 * onAttach에서 이 메서드를 호출하기 때문에 오버라이드하더라도 따로 호출할 필요는 없다.
	 */
	abstract protected void setList();
	
	/**
	 * 프래그먼트가 붙는 액티비티의 윈도우 타이틀바에 설정될 제목을 위한 문자열을 리턴해야 한다.
	 */
	abstract public String getTitleForWindow();
	
	///////////
	//////////
	/////////   interface
	
	/**
	 * 리스트 프래그먼트의 아이템이 클릭되었을 때 이벤트를 전달 받을 객체를 위한 인터페이스
	 * @author ricale
	 *
	 */
	public static interface OnListItemClickListener {
		/**
		 * 프래그먼트의 아이템이 클릭되었을 때의 콜백 메서드
		 * @param fragmentId 프래그먼트 객체의 아이디
		 * @param l          해당 리스트뷰
		 * @param view       해당 항목뷰
		 * @param position   해당 위치
		 * @param id         해당 아이디
		 */
		public void onItemClick(OBJECTID fragmentId, ListView l, View view, int position, long id);
	} // end ListFragmentItemClickListener
}
